UNICEF Data Story: Global Child Vulnerability & DTP Vaccination

Spring 2025 • BAA1030 Data Analytics & Storytelling (20074)
Student: Isha Tanwar (ID 48614)
Programme: MSc in Management (Strategy)

Note

Acknowledgement
Thanks to Prof. Dr. Damien Dupré for his unwavering guidance and support.

Introduction

This report leverages UNICEF and World Bank data (2010–2024) to construct a Composite Vulnerability Index (CVI) that synthesizes economic (GDP per capita), health (DTP vaccination coverage and life expectancy), and social (orphanhood rates) indicators. By analyzing these dimensions through fully interactive visualizations, the report aims to uncover hidden disparities, track global trends, and identify actionable policy levers. The analysis directly supports Sustainable Development Goals (SDGs) 3 (Good Health and Well-being) and 10 (Reduced Inequalities). Why it matters: Despite global progress, significant health and socio-economic gaps persist across countries. Understanding vulnerability at the intersection of economic, health, and social factors is critical for designing effective, targeted interventions to protect the most at-risk populations.

Code
import pandas as pd
import plotly.express as px
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LinearRegression

# 1) Load & preprocess data
df = pd.read_csv("merged_final.csv")
df["OrphanRate_per_1000"] = (
    df["OrphanCount"] / df["Population, total"]
) * 1000
df = df.rename(columns={
    "GDP per capita (constant 2015 US$)": "GDP",
    "Life expectancy at birth, total (years)": "LifeExpectancy"
})

# 2) Set year parameter (Quarto injects params; Jupyter fallback)
try:
    year = params.year
except NameError:
    year = 2022   # ← use any test year here when running interactively
Executive Summary

Key Findings:

  • Economic Growth and Vaccination: A $1,000 increase in GDP per capita correlates with a 0.22 percentage point rise in DTP vaccination coverage (R² ≈ 0.08), indicating a modest positive link between economic development and healthcare access.
  • Regional Disparities: DTP coverage rates remain critically low (< 60%) across Sub-Saharan Africa and South Asia, underscoring regional vulnerabilities.
  • Highest Vulnerability (2022): The countries with the highest Composite Vulnerability Index (CVI) scores are Somalia (72.5), Angola (67.7), and Nigeria (67.6), reflecting compounded economic, health, and social challenges.

Challenges:

  • Orphanhood Burden: High orphan populations in countries like Nigeria (13.9 million), DR Congo (5.8 million), Pakistan (5.8 million), Indonesia (5.7 million), and Ethiopia (3.0 million) exacerbate social vulnerability and strain on public health systems.
  • Limited Health Gains: Economic gains alone are insufficient to drive significant improvements in DTP coverage, suggesting the need for targeted health interventions alongside economic growth.

Opportunities:

  • Policy Simulations suggest that a 12% increase in GDP could lead to a 4–8 percentage point rise in DTP coverage among vulnerable nations, offering a path to meaningful health outcomes if economic development efforts are coupled with health system strengthening.

1. GDP vs DTP Coverage

Code
fig1 = px.scatter(
    df.query("Year==@year").dropna(subset=["GDP","DTP"]),
    x="GDP", y="DTP",
    size="Population, total", color="Country",
    hover_name="Country",
    log_x=True, size_max=60,
    title=f"GDP per Capita vs DTP Coverage ({year})",
    labels={"GDP":"GDP per Capita (USD)","DTP":"DTP Coverage (%)"}
)
fig1.update_layout(autosize=True)
fig1.show()

Insight: Wealth explains about 8 % of the variation in DTP coverage—economics matter but other factors are also critical.

2. Top 10 Orphanhood Burden

Code
top10 = df.query("Year==@year").nlargest(10,"OrphanCount").assign(
    Orphans_M=lambda d: d["OrphanCount"]/1e6
)
fig2 = px.bar(
    top10, x="Orphans_M", y="Country", orientation="h",
    hover_data={"Orphans_M":":.1f"}, labels={"Orphans_M":"Orphans (M)"},
    title=f"Top 10 Countries by Orphanhood ({year})"
)
fig2.update_layout(
    yaxis={'categoryorder':'total ascending'},
    autosize=True
)
fig2.show()

Insight: Five countries (Nigeria, DR Congo, Pakistan, Indonesia, Ethiopia) account for over one-third of all orphans globally.

5. Animated Global DTP Coverage Map

Code
fig5 = px.choropleth(
    df.dropna(subset=["DTP"]), locations="Country",
    locationmode="country names", color="DTP",
    animation_frame="Year", range_color=[0,100],
    color_continuous_scale="Viridis",
    title="Global DTP Coverage (2010–2024)"
)
fig5.update_layout(
    geo=dict(projection_type="natural earth"),
    autosize=True
)
fig5.show()

Insight: The slider reveals how high-income regions sustain > 95 % coverage, while many low-income areas lag below 60 %.

6. Composite Vulnerability Index (CVI)

Code
valid = df.dropna(subset=["GDP","DTP","LifeExpectancy","OrphanRate_per_1000"])
valid = valid[valid["Year"]<=year]
inv = pd.DataFrame({
    "DTP":100-valid["DTP"],
    "GDP":valid["GDP"].max()-valid["GDP"],
    "LE":valid["LifeExpectancy"].max()-valid["LifeExpectancy"],
    "OR":valid["OrphanRate_per_1000"]
})
valid["CVI"] = MinMaxScaler((0,100)).fit_transform(inv).mean(axis=1)
c = valid.query("Year==@year").nlargest(10,"CVI")
avg = valid.query("Year==@year")["CVI"].mean()

fig6 = px.bar(
    c, x="CVI", y="Country", orientation="h",
    hover_data={"CVI":":.1f"},
    title=f"Child Vulnerability Index Top 10 ({year})",
    labels={"CVI":"CVI (0–100)"}
)
fig6.add_vline(x=avg, line_dash="dash", annotation_text="Average", annotation_position="top right")
fig6.update_layout(
    yaxis={'categoryorder':'total ascending'},
    autosize=True
)
fig6.show()

Insight: Highest CVI countries (Somalia, Angola, Nigeria) need integrated economic, health, and protection programs.

7. Policy Simulator: + 12 % GDP → DTP

Code
from sklearn.linear_model import LinearRegression

# 1) Train on GDP → DTP up to selected year
train = df.query("Year <= @year").dropna(subset=["GDP","DTP"])
model = LinearRegression().fit(train[["GDP"]], train["DTP"])

# 2) Take your top-CVI DataFrame `c` (from chunk viz6-cvi)
sim = c.copy()
sim["GDP2"] = sim["GDP"] * 1.12

# 3) Prepare X for prediction: must have column name "GDP"
X_pred = sim[["GDP2"]].rename(columns={"GDP2":"GDP"})
sim["DTP2"] = model.predict(X_pred)

# 4) Melt for plotting
sim_melt = sim.melt(
    id_vars="Country",
    value_vars=["DTP","DTP2"],
    var_name="Scenario",
    value_name="Coverage"
)

# 5) Plot interactive bar
import plotly.express as px
fig7 = px.bar(
    sim_melt,
    x="Coverage", y="Country",
    color="Scenario",
    orientation="h",
    title=f"Simulated DTP Coverage with +12 % GDP ({year})",
    labels={"Coverage":"Coverage %","Scenario":"Scenario"}
)
fig7.update_layout(
    yaxis={'categoryorder':'total ascending'},
    autosize=True
)
fig7.show()

Insight: A modest GDP increase could boost immunisation by 4–8 percentage points in the most vulnerable countries—powerful evidence for targeted economic support.

SDG Alignment & Recommendations

SDG 3: Good Health & Wellbeing

Invest in mobile clinics & outreach.

SDG 10: Reduced Inequalities

Direct fiscal transfers to high-CVI nations.
Note

Next Steps Checklist

References

UNICEF (2024) Child Vulnerability Indicators. Available at: https://data.unicef.org/ (Accessed: 15 April 2025).

World Bank (2024) World Development Indicators. Available at: https://data.worldbank.org/ (Accessed: 15 April 2025).

United Nations (2023) Sustainable Development Goals. Available at: https://sdgs.un.org/goals (Accessed: 15 April 2025).